package com.yin.waimai.service;

import com.yin.waimai.config.RabbitMQConfig;
import com.yin.waimai.dto.OrderNotificationDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

/**
 * RabbitMQ消息监听器
 * 处理异步消息队列中的通知任务
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class MessageListener {

    private final NotificationService notificationService;

    /**
     * 监听通知队列，处理邮件发送任务
     * @param orderNotification 订单通知信息
     */
    @RabbitListener(queues = RabbitMQConfig.NOTIFICATION_QUEUE)
    public void handleEmailNotification(OrderNotificationDTO orderNotification) {
        log.info("收到邮件通知消息: 订单号={}, 收件人={}, 状态={}", 
                orderNotification.getOrderNumber(), 
                orderNotification.getRecipientEmail(),
                orderNotification.getOrderStatus());
        
        try {
            // 根据通知类型发送不同的邮件
            String notificationType = orderNotification.getNotificationType();
            
            if ("ORDER_CREATED".equals(notificationType)) {
                notificationService.sendOrderCreatedEmailNotification(orderNotification);
            } else if ("ORDER_STATUS_UPDATED".equals(notificationType)) {
                notificationService.sendOrderStatusEmailNotification(orderNotification);
            } else if ("DELIVERY_COMPLETED".equals(notificationType)) {
                notificationService.sendDeliveryCompletedEmailNotification(orderNotification);
            } else {
                // 默认发送状态更新邮件
                notificationService.sendOrderStatusEmailNotification(orderNotification);
            }
            
            log.info("邮件通知处理完成: 订单号={}, 类型={}", 
                    orderNotification.getOrderNumber(), notificationType);
                    
        } catch (Exception e) {
            log.error("处理邮件通知消息失败: 订单号={}, 错误信息={}", 
                    orderNotification.getOrderNumber(), e.getMessage(), e);
            // 这里可以考虑重试机制或者将失败的消息发送到死信队列
        }
    }

    /**
     * 监听订单状态队列，处理订单状态变更相关的业务逻辑
     * @param orderNotification 订单通知信息
     */
    @RabbitListener(queues = RabbitMQConfig.ORDER_STATUS_QUEUE)
    public void handleOrderStatusUpdate(OrderNotificationDTO orderNotification) {
        log.info("收到订单状态更新消息: 订单号={}, 状态={}", 
                orderNotification.getOrderNumber(), orderNotification.getOrderStatus());
        
        try {
            // 这里可以处理订单状态变更的其他业务逻辑
            // 比如更新缓存、发送WebSocket通知等
            
            // 如果用户选择了邮件通知，则发送邮件
            if (orderNotification.isEmailNotificationEnabled() && 
                orderNotification.getRecipientEmail() != null) {
                
                // 设置通知类型
                orderNotification.setNotificationType("ORDER_STATUS_UPDATED");
                
                // 发送异步邮件通知
                notificationService.sendAsyncEmailNotification(orderNotification);
            }
            
            log.info("订单状态更新处理完成: 订单号={}", orderNotification.getOrderNumber());
            
        } catch (Exception e) {
            log.error("处理订单状态更新消息失败: 订单号={}, 错误信息={}", 
                    orderNotification.getOrderNumber(), e.getMessage(), e);
        }
    }

    /**
     * 监听配送位置队列，处理配送员位置更新
     * @param locationData 位置数据（这里简化为字符串，实际可以是专门的DTO）
     */
    @RabbitListener(queues = RabbitMQConfig.DELIVERY_LOCATION_QUEUE)
    public void handleDeliveryLocationUpdate(String locationData) {
        log.info("收到配送位置更新消息: {}", locationData);
        
        try {
            // 这里可以处理配送员位置更新的业务逻辑
            // 比如更新数据库中的位置信息、通过WebSocket推送给前端等
            
            log.info("配送位置更新处理完成: {}", locationData);
            
        } catch (Exception e) {
            log.error("处理配送位置更新消息失败: 位置数据={}, 错误信息={}", 
                    locationData, e.getMessage(), e);
        }
    }
}